package com.cskaoyan.javase.oop1._5this;

/**
 * @description: this关键字
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * > 按照下述说明写代码，研究问题
 * - 创建一个汽车类，有颜色和速度两个属性，行为是可以跑
 *   - 然后在成员方法中访问该属性，创建对象后调用该方法并查看结果
 *   - 然后在成员方法的形参列表中，定义和属性同名的局部变量，不修改方法体再次调用该方法
 * - 思考：
 *   - 两次调用的结果是否一致，如果不同原因是什么
 *   - 如果我想在有同名参的方法中，访问同名成员变量，怎么办？
 *
 *
 *
 * 如果成员方法的形参名字和该类的成员变量的名字相同了,这时在方法内部直接访问该同名变量
 * 访问的结果是局部变量的speed
 * 这是因为Java当中的"就近原则"的影响,方法会优先选择较近的局部变量使用
 *
 * 如果在这时仍然想访问同名的成员变量,就需要使用this关键字
 *
 * this关键字:
 *      在一个Java类的任何(不加static)成员方法中,它的形参列表中都隐含了一个传参
 *      这个传参表示当前对象,这个对象用this指向
 *      所以this是一个引用,它指向当前对象
 *
 * 何为当前对象?
 *      用哪个对象去调用成员方法,那个对象就是当前对象
 *      谁在调用成员方法,谁就是当前对象
 *
 * this关键字的使用语法:
 *      this是一个引用,可以直接用this.去访问当前对象的成员变量和成员方法
 *
 * this关键字的作用:
 *      1. 可以在成员方法中区分同名的成员变量和局部变量
 *
 *      2. 可以在成员方法中去调用别的成员方法（实际上并没有必要写出这个this）
 *         static方法和static方法之间可以直接互相调用
 *         非static成员方法之间也可以直接互相调用
 *         static方法中想要访问成员方法，必须先创建对象
 *      3. this很重要的用途是：
 *    - 用来指示一个变量到底是成员变量还是局部变量
 *    - **在代码比较复杂的情况下，可以显著增加代码可读性**
 *      (不是强制要加的,如果不想加可以不加 )
 *
 *      4. this关键字的作用远不止此,还有一些功能我们后面再学习
 *
 *
 * 正是因为成员方法的形参列表中隐含了this传参,所以成员方法可以无条件访问同类的成员变量和成员方法
 * 而static方法中是没有隐含this传参的,所以static方法不能直接访问成员变量和成员方法(如果想要访问,就创建对象,然后用对象名点去访问它)
 *
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        /*Car c = new Car();
        c.run(120);*/

        Car c = new Car();
        Car c2 = new Car();
        Car c3 = new Car();

        System.out.println(c);
        System.out.println(c2);
        System.out.println(c3);

        c.printThis();
        c2.printThis();
        c3.printThis();
    }
}

class Car {
    //char类型默认值\u0000表示绝对空字符
    char color = '黄';
    double speed = 100;

    public void printThis(){
        System.out.println(this);
    }


    public  void run(double speed) {
        System.out.println(color + "色小汽车以" + this.speed + "公里每小时的速度嘟嘟嘟得跑!~");
    }

    public void test(){
        run(100);
    }

    public static void testStatic(){
        Car c = new Car();
        System.out.println(c.color);
    }
}